/** Keriosity, ESIR 2
 * 	WifiAuto (Modele): classe permettant d'envoyer notre robot en mission automatiquem
 *	@author: GOUYET Brett
 *	@date: 19/03/2012, deniere modif: 20/03 
 */

package keriosity.connection;

import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.osmdroid.util.GeoPoint;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;

import android.util.Log;


public class WifiAuto extends WifiConnection implements IWifiServer{  

	protected String _urlOrder; //url ou l'on envoi les ordres de mission sur le serveur
	protected String _urlGPS; //url ou l'on va recuperer la position GPS du robot
	
		/** CONSTRUCTEUR **/ 
	
	public WifiAuto(String urlOrder, String urlGPS){
		
		super();
		_urlOrder = urlOrder;
		_urlGPS = urlGPS;	
	}
	
	
		/** METHODES HERITEES **/
	
	/** On se connecte **/
	public boolean connect(String name) {
		return super.connect(name);
	}
			
	
	/** On envoi un ordre **/
	public boolean send(String order){		
		return super.send(super.getIP() + _urlOrder + order);  //on cree la requete a partir de l'adresse IP et de l'ordre a envoyer
	}

	
	/** Deconnection **/
	public boolean disconnect() {return super.disconnect();}
	
	
	/** Methode renvoyant l'etat de la connection **/
	public boolean isConnected() {return super.isConnected();}

	
	
		/** METHODES PERMETTANT DE GERER LE GPS DU ROBOT **/	
	
	
	/** Methode permettant de recuperer le contenu d'une page a partir d'une url
	 * 
	 * @param url: adresse de la page
	 * @return String: contenu de la page 
	 */
	public String getContentpage(String url){
		
		Log.i("getContentpage", url);
		try{			
			HttpClient httpClient = new DefaultHttpClient(); //on creer notre client
			HttpGet httpGet = new HttpGet(url);			
						
			ResponseHandler<String> reponsehandler = new BasicResponseHandler();
			String reponse = httpClient.execute(httpGet, reponsehandler); //on execute le get
			return reponse;	//on renvoi le contenu de la page		
		}
		catch (Exception e) {Log.i("getContentpage", "echec");	return "";} //en cas d'erreur on renvoit une chaine vide	
	}
	
	
	/** Methode permettant de mettre a jour les donnees GPS du robot
	 *  @return GeoPoint: nouvelles coordonees du robot
	 */
	public GeoPoint getGPS(){
		
		try {				
			//on recupere le contenu de la page web contenant les donnees GPS
			String gpsContentPage = getContentpage(super.getIP()+_urlGPS);				 
			if(gpsContentPage == "") return null; //erreur lors de la recuperation
			
			//on parse le contenu en donnees xml
			DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			Document docXml = parser.parse(new InputSource(new StringReader(gpsContentPage))); 
			
			//puis on recupere les attributs lat et lon
			Element position = (Element)docXml.getElementsByTagName("position").item(0); //on recupere l'element position
			String latitude = position.getAttribute("lat");
			String longitude = position.getAttribute("lon");
			
			//pour ensuite mettre a jour les donnees gps
			if(latitude != null && longitude != null && latitude != "" && longitude != ""){ //on verifie que les donnees sont correctes
				
				//on converti les donnees GPS de String en Float
				float lat = Float.parseFloat(latitude);
				float lon = Float.parseFloat(longitude);
				return new GeoPoint(lat, lon);
			}
			return null;		
		} 
		catch (Exception e) {return null;}		
	}
}
